// #pragma once

// #include <Arduino.h>
// #include "esp_http_client.h"
// #include "freertos/FreeRTOS.h"
// #include "freertos/task.h"
// #include <SD_MMC.h>
// #include "task.h"

// // 定义下载状态枚举
// enum class DownloadStatus
// {
//     IDLE,
//     DOWNLOADING,
//     COMPLETED,
//     FAILED
// };

// // 定义事件处理函数类型
// typedef void (*DownloadEventCallback)(DownloadStatus status);

// typedef struct
// {
//     String url;
//     String filePath;
//     char *certPem;
// } HttpsDownloadInfo_t;

// class HttpsDownload
// {
// private:
//     HttpsDownloadInfo_t info;
//     esp_http_client_handle_t client;
//     File file;
//     size_t totalSize;
//     size_t downloadedSize;
//     DownloadStatus status;
//     DownloadEventCallback eventCallback;
//     int retryCount;
//     static const int MAX_RETRIES = 3;
//     TickType_t startTime;

//     static esp_err_t eventHandler(esp_http_client_event_t *evt);
//     esp_err_t performDownload();
//     void updateStatus(DownloadStatus newStatus);

// public:
//     HttpsDownload(HttpsDownloadInfo_t &info);
//     ~HttpsDownload();
//     esp_err_t startDownload();
//     void setEventCallback(DownloadEventCallback callback);
//     DownloadStatus getStatus();
//     size_t getTotalSize();
//     size_t getDownloadedSize();
//     float getDownloadPercentage();
//     float getAverageDownloadSpeed();
// };

// // 自定义任务类，继承自 Task
// class MyTask : public Task
// {
// public:
//     MyTask(std::string taskName = "MyTask", uint16_t stackSize = 10000, uint8_t priority = 5)
//         : Task(taskName, stackSize, priority) {}

//     // 实现纯虚函数 run
//     void run(void *data) override
//     {

//         HttpsDownloadInfo_t* info = static_cast<HttpsDownloadInfo_t*>(data);
//         ESP_LOGI("y","info path:%s",info->filePath.c_str());
//         ESP_LOGI("y","info url:%s",info->url.c_str());
//         ESP_LOGI("y","info certPem:%s",info->certPem);
//         if (info) {
//             HttpsDownload download(*info);
//             download.startDownload();
//             vTaskDelete(nullptr);
//         }
//     }
// };